<?php

abstract class OrderService
{
    /**
     * Chỗ này là một transaction, vì Order cần phải đồng bộ với các Order Detail
     * Nếu không đồng bộ có thể sẽ xảy ra trường hợp đơn đặt hàng có Total Cost > 0
     * nhưng lại không chứa bất cứ Product Item nào
     * @return int
     */
    public static function order()
    {
        $user = JFactory::getUser();
        if ($user->IsGuest) {
            return OrderResult::FAILURE_USER_NOT_LOGIN;
        }

        if (!$user->Confirmed) {
            return OrderResult::FAILURE_USER_UNCONFIRM;
        }

        $shoppingCart = JFactory::getShoppingCart();
        if ($shoppingCart->TotalCost == 0) {
            return OrderResult::FAILURE_CART_EMPTY;
        }

        // BEGIN TRANSACTION
        $orderID = Application_Model_Order::addOrder(
            $shoppingCart->Name, $shoppingCart->TotalCost, $user->ID
        );
        if ($orderID != 0) {
            foreach ($shoppingCart->ProductItems as $productItem) {
                Application_Model_OrderDetail::addOrderDetail(
                    $orderID, $productItem->ID, $productItem->Amount,
                    $productItem->TotalCost
                );
            }
        }
        // END TRANSACTION

        JSession::setShoppingCart(null);

        return OrderResult::SUCCESS;
    }
}

class OrderResult
{
    const FAILURE_USER_NOT_LOGIN = 0;
    const FAILURE_USER_UNCONFIRM = 1;
    const FAILURE_CART_EMPTY = 2;
    const SUCCESS = 4;
}